package study.IO.字节流.OutputStream;

import java.io.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class ZipOutputStream_demo {
	public static void main(String[] args) throws IOException {
		// 压缩文件夹
		// 1.创建File对象表示要压缩的文件夹
		File src = new File("Files\\bbb");
		// 2.创建File对象表示压缩包放在哪里（父级路径）
		File destParent = src.getParentFile();//Files\
		// 3.创建File对象表示压缩包的路径
		File dest = new File(destParent, src.getName() + ".zip");
		// 4.创建压缩包流关联压缩包
		ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(dest));
		// 5.获取src里面每一个文件，变成ZipEntry对象，放到压缩包当中（递归）
		toZip(src,zos,src.getName());
		// 6.释放资源
		zos.close();
	}
	
	/*
	作用：获取src里面的每一个文件，变成ZipEntry对象，放到压缩包当中
	参数一：数据源
	参数二：压缩流
	参数三：压缩包内部的数据
	 */
	public static void toZip(File src, ZipOutputStream zos, String name) throws IOException {
		// 	1.进入src文件夹
		File[] files = src.listFiles();
		
		// 	2.遍历数组
		for (File file : files) {
			// 	判断是文件还是文件夹
			if (file.isFile()) {
				System.out.println(file);
				// 	如果是文件那么变成ZipEntry对象，放入压缩包中
				ZipEntry zipEntry = new ZipEntry(name + "\\" + file.getName());
				zos.putNextEntry(zipEntry);
			// 	存入数据
				FileInputStream in = new FileInputStream(file);
				int b;
				while((b = in.read()) != -1){
					zos.write(b);
				}
				in.close();
				zos.closeEntry();
				
			} else {
				// 	如果是文件夹，那么递归往下查找文件
				toZip(file, zos, name + "\\" + file.getName());
				
			}
		}
		
		
	}
	
	
}
